home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 July
/
EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso
/
lightwave
/
arexx_macros
/
sortlw.rex
< prev
Wrap
OS/2 REXX Batch file
|
1996-12-09
|
6KB
|
282 lines
/* $VER: SortLWScene.rexx v1.3 · 20 Jun 1995
* Sorts objects in a LightWave 3D scene file
* Considers and maintains parent, aim and morph targets; Does NOT
* sort names for Bone heirarchy within an object.
* By: Bryan Ewert
*/
/* History:
* v1.3 (20 Jun 1995)
* - BUG! Not respecting MorphTargets
* v1.2 (09 Feb 1995)
* - Purge libs when done
* v1.1 - Added CLIPs for memory
* - replaced DIRECTORY() with up-to-date engine
* v1.0 - Initial release
*/
PARSE ARG Scene
IF Scene='?' THEN DO
SAY '
SortLWScene v1.3
(20 Jun 1995) by Bryan Ewert'
SAY ''
SAY 'TEMPLATE:
SortLWScene.rexx <LWScene>
'
SAY '
<LWScene>
is optional -- omitting it will provide a file requester.'
SAY ' (this will require RexxArpLib.library!)'
SAY 'Default output file will be <LWScene> with ".sort" extension'
SAY ''
EXIT
END
Sorted=Scene || '.sort'
IF Scene='' THEN DO
AddRexxArp = ADDLIB('rexxarplib.library',0,-30,0)
Scene='JUUL:'
IF GETCLIP(SLW_Scene)~='' THEN Scene=GETCLIP(SLW_Scene)
Scene=GetFile(50, 25, DIRECTORY(Scene), FILENAME(Scene), 'Sort which scene?', WorkBench)
IF Scene='' THEN DO
CALL PURGELIBS(AddRexxArp)
EXIT
END
CALL SETCLIP(SLW_Scene, Scene)
Sorted=GetFile(50, 25, DIRECTORY(Scene), FILENAME(Scene) || '.sort', 'Save sorted scene as?', WorkBench, "SAVE")
IF Sorted='' THEN DO
CALL PURGELIBS(AddRexxArp)
EXIT
END
END
Arp=SHOW('L','rexxarplib.library')
CALL PRAGMA('W', 'NULL')
IF ~EXISTS(Scene) THEN DO
SAY 'Sorry... cannot find' Scene
CALL PURGELIBS(AddRexxArp)
EXIT 10
END
IF EXISTS(Sorted) THEN DO
IF Arp THEN DO
Query=Request(50, 25, '** WARNING! **\\' || Sorted '\already exists\\Overwrite?\',,'Sure', 'NO!', WorkBench)
IF Query~='OKAY' THEN DO
CALL PURGELIBS(AddRexxArp)
EXIT
END
END
ELSE DO
SAY ''
SAY '** WARNING! **'
SAY Sorted 'already exists!'
SAY 'Overwrite?'
PULL Overwrite
IF ABBREV(Overwrite, 'Y')=0 THEN DO
CALL PURGELIBS(AddRexxArp)
EXIT
END
END
END
CALL PRAGMA('W', 'WorkBench')
CALL OPEN(LWScene, Scene, R)
IF READLN(LWScene)~='LWSC' THEN DO
SAY Scene 'is NOT a LightWave scene file.'
CALL PURGELIBS(AddRexxArp)
EXIT 10
END
Null=READLN(LWScene)
Null=READLN(LWScene)
Objects=0
Data.Objects=''
Message='Please wait... reading LWScene...'
IF Arp THEN CALL PostMsg(50, 25, Message, 'WorkBench')
ELSE SAY Message
DO FOREVER
Line=READLN(LWScene)
IF ABBREV(Line, 'AmbientColor') THEN LEAVE
IF ABBREV(Line, 'LoadObject') | ABBREV(Line, 'AddNullObject') THEN DO
Objects=Objects+1
Number.Objects=Objects
Data.Objects=''
Parent.Objects=0
Target.Objects=0
IF ABBREV(Line, 'LoadObject') THEN Name.Objects=FILENAME(Line)
ELSE Name.Objects=SUBWORD(Line, 2)
OldName.Objects=Name.Objects
END
Data.Objects=Data.Objects || Line || '0a'x
END
EndData=Line || '0a'x || READCH(LWScene, 64000)
CALL CLOSE(LWScene)
Message='Done reading... now parsing...'
IF Arp THEN CALL PostMsg(50, 25, Message, 'WorkBench')
ELSE SAY Message
DO I=1 TO Objects-1
DO J=I+1 TO Objects
IF Name.I > Name.J THEN DO
Temp=Data.I ; Data.I=Data.J ; Data.J=Temp
Temp=Number.I ; Number.I=Number.J ; Number.J=Temp
Temp=Name.I ; Name.I=Name.J ; Name.J=Temp
END
END
END
/* S=Start position of line
* E=End position of Line (NL)
* Old=Where the script says the parent is
* New=Where the parent SHOULD be
*/
DO I=1 TO Objects
S=POS('EndBehavior ', Data.I)
E=POS('0a'x, Data.I, S)
OnBone=0
DO FOREVER
Line=NEXTLINE(Data.I)
Command=SUBWORD(Line, 1, 1)
IF Command='ShadowOptions' THEN ITERATE I
IF Command='AddBone' THEN DO
OnBone=1 /* So it skips ParentObject for bones. */
DO UNTIL WORD(NEXTLINE(Data.I), 1)='EndBehavior'
END
END
IF (Command='ParentObject' & OnBone=0) | Command='MorphTarget' | Command='TargetObject' THEN DO
SAY 'Found' Command
Old=SUBWORD(Line, 2)
DO K=1 TO Objects
IF Number.K=Old THEN DO
New=K
LEAVE K
END
END
Data.I=LEFT(Data.I, S-1) || Command New || SUBSTR(Data.I, E)
E=POS('0a'x, Data.I, E-4)
END
END
END
Option.1='ParentObject'
Option.2='TargetObject'
Option.2='MorphTarget'
DO I=1 TO 3
E=1
DO FOREVER
S=POS(Option.I, EndData, E)
IF S=0 THEN ITERATE I
SAY 'Found' Option.I
E=POS('0a'x, EndData, S)
Line=SUBSTR(EndData, S, E-S)
Old=SUBWORD(Line, 2)
DO K=1 TO Objects
IF Number.K=Old THEN DO
New=K
LEAVE K
END
END
EndData=LEFT(EndData, S-1) || Option.I New || SUBSTR(EndData, E)
E=POS('0a'x, EndData, E-4)
END
END
CALL OPEN(LWSort, Sorted, W)
CALL WRITELN(LWSort, 'LWSC')
CALL WRITELN(LWSort, '1')
CALL WRITELN(LWSort, '')
DO I=0 TO Objects
CALL WRITECH(LWSort, Data.I)
END
CALL WRITECH(LWSort, EndData)
CALL CLOSE(LWSort)
IF Arp THEN CALL PostMsg()
ELSE SAY 'Done!'
CALL PURGELIBS(AddRexxArp)
EXIT
----------------------------------------------------------------------
NEXTLINE:
PARSE ARG Work
S=E+1
Z=POS('0a'x, Work, S)
E=Z
Line=SUBSTR(Work, S, E-S)
RETURN Line
----------------------------------------------------------------------
DIRECTORY: PROCEDURE
PARSE ARG pathname
Slash=1
Here=LastPos("/", pathname)
IF here = 0 THEN DO
Slash=0
here = LastPos(':', pathname)
END
IF here = 0 THEN
RETURN ''
ELSE
RETURN LEFT(pathname, Here-Slash)
FILENAME: PROCEDURE
PARSE ARG pathname
here = LastPos("/", pathname)
IF here = 0 THEN
here = LastPos(":", pathname)
IF here = 0 THEN
RETURN pathname
ELSE
RETURN(SubStr(pathname, here+1))
PURGELIBS: PROCEDURE
PARSE ARG AddRexxArp
IF AddRexxArp THEN CALL REMLIB('rexxarplib.library')
RETURN